﻿using System;
using System.Reflection.Emit;

namespace Cubicle.Excel.Binding
{
    public static class EmitHelpers
    {

        public static void EmitCast(ILGenerator ilGenerator, Type type)
        {
            if (type.IsValueType)
            {
                ilGenerator.Emit(OpCodes.Unbox_Any, type);
            }
            else
            {
                ilGenerator.Emit(OpCodes.Castclass, type);
            }
        }

        public static void EmitBoxing(ILGenerator ilGenerator, Type type)
        {
            if (type.IsValueType)
            {
                ilGenerator.Emit(OpCodes.Box, type);
            }
        }

        public static void EmitInt(ILGenerator ilGenerator, int value)
        {
            if (value == 0)
                ilGenerator.Emit(OpCodes.Ldc_I4_0);
            else if (value == 1)
                ilGenerator.Emit(OpCodes.Ldc_I4_1);
            else if (value == 2)
                ilGenerator.Emit(OpCodes.Ldc_I4_2);
            else if (value == 3)
                ilGenerator.Emit(OpCodes.Ldc_I4_3);
            else if (value == 4)
                ilGenerator.Emit(OpCodes.Ldc_I4_4);
            else if (value == 5)
                ilGenerator.Emit(OpCodes.Ldc_I4_5);
            else if (value == 6)
                ilGenerator.Emit(OpCodes.Ldc_I4_6);
            else if (value == 7)
                ilGenerator.Emit(OpCodes.Ldc_I4_7);
            else if (value == 8)
                ilGenerator.Emit(OpCodes.Ldc_I4_8);
            else if (value > -129 && value < 128)
                ilGenerator.Emit(OpCodes.Ldc_I4_S, (SByte)value);
            else
                ilGenerator.Emit(OpCodes.Ldc_I4, value);
        }

        public static void EmitArg(ILGenerator ilGenerator, int value)
        {
            if (value == 0)
                ilGenerator.Emit(OpCodes.Ldarg_0);
            else if (value == 1)
                ilGenerator.Emit(OpCodes.Ldarg_1);
            else if (value == 2)
                ilGenerator.Emit(OpCodes.Ldarg_2);
            else if (value == 3)
                ilGenerator.Emit(OpCodes.Ldarg_3);
            else if (value > -129 && value < 128)
                ilGenerator.Emit(OpCodes.Ldarg_S, (SByte)value);
            else
                ilGenerator.Emit(OpCodes.Ldarg, value);
        }
        
    }
}